`
https://leetcode.cn/problems/subarray-product-less-than-k/
`

/**
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var numSubarrayProductLessThanK = function (nums, k) {
  let left = 0, right = 0

  let window = 1

  let res = 0

  while (right < nums.length) {
    window *= nums[right]
    right++

    while (left < right && window >= k) {
      window /= nums[left]
      left++
    }
    // 现在必然是一个合法的窗口，但注意思考这个窗口中的子数组个数怎么计算：
    // 比方说 left = 1, right = 4 划定了 [1, 2, 3] 这个窗口（right 是开区间）
    // 但不止 [left..right] 是合法的子数组，[left+1..right], [left+2..right] 等都是合法子数组
    // 所以我们需要把 [3], [2,3], [1,2,3] 这 right - left 个子数组都加上
    // 至于 [1], [2], [1, 2] ，它们已经在之前的循环加过了
    res += right - left
  }

  return res
};